package com.ys.homework;

import java.util.Arrays;

/**
 * @author CodeYang
 * @Description TODO
 * @Date 2020/12/11 21:11
 */
public class 随机生成100个随机数并排序输出 {

    public static void main(String[] args) {
        System.out.println("随机生成100个随机数并排序输出-升序");
        int[] arr = creteArr(100, 0, 100);
        // Arrays.sort(arr);
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }

    /**
     * 生成指定范围的随机数整数[form,to)
     *
     * @param count int 生成多少个
     * @param min   int 最小值
     * @param max   int 最大值,不包括to
     * @return 返回一个 指定范围的随机数的数组 如果count 为0 返回null
     */
    private static int[] creteArr(int count, int min, int max) {
        if (count == 0) {
            return null;
        }
        int[] newArr = new int[count];
        for (int i = 0; i < count; i++) {
            newArr[i] = min + (int) (Math.random() * max);
        }
        return newArr;
    }

    /**
     * 冒泡排序 升序
     * 核心: 相邻连两个元素做比较,如果前一个元素大于后一个元素,则交换位置
     * 1: 每次比对后,都能确定一个最大值,在最后面
     * 2:第i躺循环的比对次数,比 上一趟(i-1) 少一次
     * 3:最终遍历的次数--外层比较次数-  length-1
     * --------
     * 优化 在 i==len-1-1 之前已经排序完成
     * 假设已经成功
     *
     * @param arr
     */
    static void sort(int[] arr) {
        int len = arr.length;
        for (int i = 0; i < len - 1; i++) {
            //1 假设本次循环就是最后一次排序完成
            System.out.println("循环执行次数"+(i));
            boolean flag = true;
            for (int j = 0; j < len - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    // 交换两个变量的值
                    arr[j] = arr[j] ^ arr[j + 1];
                    arr[j + 1]= arr[j] ^ arr[j + 1];
                    arr[j]= arr[j] ^ arr[j + 1];
                    flag =false;
                }
            }
            if (flag){
                return;
            }
        }
    }
}
